#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<vector>
#include<set>
using namespace std;

const int maxn=1000;
int sig(double d) {
	return fabs(d) < 1E-6 ? 0 : d < 0 ? -1 : 1;
}

struct Point{
	double x, y;
	double k;
	Point(){}
	Point(double x, double y): x(x), y(y) {}
	void set(double x, double y) {
		this->x = x;
		this->y = y;
	}
	double mod(){//模
		return sqrt(x*x+y*y);
	}
	double mod_pow(){//模的平方
		return x*x + y*y;
	}
	void output() {
		printf("x = %f, y = %f\n", x, y);
	}
	bool operator < (const Point &p) const {
		return sig(x-p.x) != 0 ? x < p.x : sig(y-p.y) < 0;
	}
};
double cross(Point o, Point a, Point b) {
	return (a.x - o.x)*(b.y - o.y)-(b.x - o.x)*(a.y - o.y);
}

/*
	判断直线a,b   和   c,d是否相交

	类型				返回	p
--------------------------------------
壹.	不相交（平行）		0		不变
2.	规范相交			壹		交点
3.	非规范相交（重合）	2		不变
*/
int lineCross(Point a, Point b, Point c, Point d, Point &p) {
	double s1, s2;
	s1=cross(a,b,c);
	s2=cross(a,b,d);
	if(sig(s1)==0 && sig(s2)==0)	return 2;
	if(sig(s2-s1)==0)	return 0;
	p.x = (c.x*s2-d.x*s1)/(s2-s1);
	p.y = (c.y*s2-d.y*s1)/(s2-s1);
	return 1;
}
/**	下面开始计算半平面交!!!!!!!!!!!
	如果直线l1,l2,l3过一个点，未删除中间的那条边！（照顾点的退化情况）因此核可能有重复的点
	退化情况：
		1.如果是多边形，无大碍，参考calCore函数
		2.如果是线性规划，建议加入边界来约束
*/
/**
	精简了上面的calPolygon，只保留了area和shun的返回
*/
void calPolygon(Point*p, int num, double &area, bool &shun) {
	p[num] = p[0];
	area = 0;
	double tmp;
	for(int i=0; i < num; i ++) {
		tmp = p[i].x*p[i+1].y - p[i].y*p[i+1].x;
		area += tmp;
	}
	area /= 2.0;
	if(shun=area<0)
		area = -area;
}
/**
	一条直线，a和b再此直线上，并且a指向b
	angle指向了向量(a, b) 左面 的方向
	因此反映了半平面！！！
*/
struct Line {
	Point a, b;
	double angle;
	Line(){}
	Line(Point a, Point b) : a(a), b(b) {
		angle = atan2(b.x-a.x, a.y-b.y);
	}
	bool operator < (const Line & l) const {
		return (angle-l.angle)!=0 ? angle<l.angle : cross(a, b, l.b)<0;
	}
/**
	叉乘
*/
	double operator * (const Line & l) const {
		return (b.x-a.x) * (l.b.y-l.a.y) - (l.b.x-l.a.x) * (b.y-a.y);
	}
};
/**
	zzy的副主函数，用于判断m点是否应该被弹出
	如果m和n平行，返回true
	如果m和n的交点严格再l之外，返回true
	如果m和n的交点严格再l之内，返回false
	如果m和n的交点再l上，则判断n和l的交是否完全被m包含，若是，返回true。此步具体做法：
	判断m和n在l的同侧，并且n和l再m的异侧
（由于本算法是ax+by+c<=0的，如果计算ax+by+c<0，不要轻易改变out返回值，建议就这样计算，然后看面积是否为0）
*/
bool out(Line m, Line n, Line l)
{
	Point p;
	if(lineCross(m.a, m.b, n.a, n.b, p) != 1)
	{
		return true;
	}
	double d = cross(l.a, l.b, p);
	if(sig(d) != 0)	return d < 0;
	double a = m*l, b = n*l, c = m * n;
	return sig(a)*sig(b)>0 && sig(a)*sig(c)<0;}
/**
	用zzy大牛的方法计算半年平面交
	将传入的半平面原地筛选，选出有用的半平面
	参数：
		l:	传入的半平面，程序中将作为队列，程序结束保存有用的半平面
		n:	传入的半平面个数
		b:	计算后l的队列底
		t:	计算后l的队列顶
		[b, t]	闭区间！
*/
void zzy(Line* l, int n, int &b, int &t)
{
	sort(l, l+n);
	int i, j;
	for(i=1, j=0; i < n; i ++)
		if(sig(l[i].angle-l[j].angle) != 0)
			l[++ j] = l[i];
	for(b=0, t=1, i=2; i <= j; i ++) {
		while(b<t && out(l[t], l[t-1], l[i]))	t--;
		while(b<t && out(l[b], l[b+1], l[i]))	b++;
		l[++ t] = l[i];
	}
	while(n != t-b) {
		n = t-b;
		while(b<t && out(l[t], l[t-1], l[b]))	t--;
		while(b<t && out(l[b], l[b+1], l[t]))	b++;
	}
}

/**
	求多边形的核----zzy计算半平面交的进一步扩展
	同zzy函数一样，也是原地筛选出核
	参数：
		ps:	传入的多边形，程序结束后会成为核的多边形
		n:	传入的多边形的边数，程序结束后会成为核的多边形的边数
	返回：
		返回是否有核
*/
bool calCore(Point *ps, int &n) {
	static Line l[maxn];
	ps[n] = ps[0];
	bool shun;
	double area;
	int b, t, i;
	calPolygon(ps, n, area, shun);
	if(shun)
		for(i = 0; i < n; i ++)
			l[i] = Line(ps[i+1], ps[i]);
	else
		for(i = 0; i < n; i ++)
			l[i] = Line(ps[i], ps[i+1]);
	zzy(l, n, b, t);
	l[t+1] = l[b];
	n = t-b+1;
	if(n < 3)	return false;
	for(i = b; i <= t; i ++) {
		lineCross(l[i].a, l[i].b, l[i+1].a, l[i+1].b, ps[i-b]);
	}
	return true;
}
int main()
{
	int n;
	Point p[110];
	while(scanf("%d",&n),n)
	{
		for(int i=0;i<n;i++)
			scanf("%lf%lf",&p[i].x,&p[i].y);
		if(calCore(p,n))puts("1");
		else puts("0");
	}
	return 0;
}
